package week3;

import jsjf.LinearNode;
import jsjf.QueueADT;
import jsjf.exceptions.EmptyCollectionException;

public class LinkedQueue<T> implements QueueADT<T> {

    private int count;
    private LinearNode<T> head,tail;

    // 创建一个空队列
    public LinkedQueue()
    {
        count = 0;
        head = tail = null;
    }


    @Override
    public void enqueue(T element) {
        LinearNode<T> node = new LinearNode<T>(element);

        if (isEmpty())
        {
            head = node;
        }
        else
        {
            tail.setNext(node);
        }
        tail = node;
        count++;
    }

    @Override
    public T dequeue() throws EmptyCollectionException {
        if (isEmpty())
        {
            throw new EmptyCollectionException("queue");
        }
        T result = head.getElement();
        head = head.getNext();
        count--;

        if (isEmpty())
        {
            tail = null;
        }
        return result;
    }

    @Override
    public T first() {
        T result = head.getElement();
        return result;
    }

    @Override
    public boolean isEmpty() {
        if (count ==0)
            return true;
        else
            return false;
    }

    @Override
    public int size() {
        return count;
    }

    public String toString()
    {
        String result = "";
        LinearNode temp = head;
        while (temp != null)
        {
            result += temp.getElement() + "";
            temp = temp.getNext();
        }
        return result;
    }
}
